package grape.attend.service.user.api;

import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
import grape.attend.service.classe.po.Classe;
import grape.attend.service.group.po.Group;
import grape.attend.service.user.po.UserClock;
import grape.attend.service.user.po.UserOvertime;
import grape.common.service.common.IBaseService;

import java.util.Date;
import java.util.List;

/**
 * <p>
 * 用户打卡表 服务类
 * </p>
 *
 * @author yangwei
 * @since 2020-05-18
 */
public interface IUserClockService extends IBaseService<UserClock> {
    /**
     * 计算两个毫秒数的相差分钟数
     * @param bigOneMs
     * @param smallOneMs
     * @return
     */
    public static int getIntervalMinutes(long bigOneMs,long smallOneMs){
        return (int) Math.ceil((bigOneMs - smallOneMs)/ DateUnit.MINUTE.getMillis());
    }

    /**
     * 用户上班打卡
     * @param userClock groupId和classeId必填
     * @return
     */
    UserClock onClock(UserClock userClock,Boolean isClasseYestoday,String userId);

    /**
     * 用户下班打卡
     * @param userClock groupId和classeId必填
     * @return
     */
    UserClock offClock(UserClock userClock,Boolean isClasseYestoday,String userId);

    /**
     * 获取默认的法定节假日
     * @return 返回元素 MM-dd 都为阳历
     */
    String [] getDefaultLegal(Date classeDate);
    /**
     * 获取上下班打卡
     * @param groupId
     * @param classeId
     * @param userId
     * @param classeDate 班次日期，不考虑时间
     * @return
     */
    UserClock getClock(String groupId, String classeId, String userId, Date classeDate);

    /**
     * 查询班次日期的打卡信息
     * @param userClockDateId
     * @return
     */
    default List<UserClock> getByUserClockDateId(String userClockDateId){
        if (isStrEmpty(userClockDateId)) {
            return null;
        }
        UserClock userClock = new UserClock();
        userClock.setUserClockDateId(userClockDateId);
        return list(userClock);
    }
    /**
     * 是否允许上班打卡
     * @param group
     * @param classe
     * @param nextClass 下一个班次
     * @param nextClassGroup 下一个班次所在的考勤组
     * @param userClock 上班打卡记录
     * @param isClasseYestoday 是否昨日班次
     * @return
     */
    public static Boolean isAllowOnClock(Group group, Classe classe,Classe nextClass,Group nextClassGroup,UserClock userClock, boolean isClasseYestoday) {

        // 上班卡只能打一次
        if(userClock != null){
            return false;
        }
        // 当前毫秒数
        long now = DateUtil.current(false);

        long startTime = DateUtil.parseTimeToday(classe.getStartTime()).getTime();
        long endTime = DateUtil.parseTimeToday(classe.getEndTime()).getTime();

        if (nextClass == null) {
            nextClass = classe;
        }
        if (nextClassGroup == null) {
            nextClassGroup = group;
        }
        // 昨日的班次
        if (isClasseYestoday) {
            // 如果跨天
            if (endTime < startTime) {
                // 上班打卡时间已经过了下班时间不能再打上班卡
                if(now > endTime){
                    return false;
                }
            }else {
                // 不跨天，昨日的上班卡不能打
                return false;
            }
        }else {
            // 如果跨天
            if (endTime < startTime) {
            }else {
                // 不跨天， 上班打卡时间已经过了下班时间不能再打上班卡
                if(now > endTime){
                    return false;
                }
            }
        }


        return true;
    }
    /**
     * 是否允许下班打卡
     * @param group
     * @param classe
     * @param nextClass 下一个班次
     * @param nextClassGroup 下一个班次所在的考勤组
     * @param userClock 下班打卡记录
     * @param isClasseYestoday 是否昨日班次
     * @return
     */
    public static Boolean isAllowOffClock(Group group, Classe classe,Classe nextClass,Group nextClassGroup,UserClock userClock, boolean isClasseYestoday) {


        // 当前毫秒数
        long now = DateUtil.current(false);

        long startTime = DateUtil.parseTimeToday(classe.getStartTime()).getTime();
        long shouldStartTime = startTime - DateUnit.DAY.getMillis();
        long endTime = DateUtil.parseTimeToday(classe.getEndTime()).getTime();

        if (nextClass == null) {
            nextClass = classe;
        }
        if (nextClassGroup == null) {
            nextClassGroup = group;
        }
        long nextStartTime = DateUtil.parseTimeToday(nextClass.getStartTime()).getTime();
        long nextShouldStartTime = startTime - DateUnit.DAY.getMillis();
        long nextEndTime = DateUtil.parseTimeToday(nextClass.getEndTime()).getTime();

        // 如果下一个班次已经上班，不能再打下班卡
        if(now > nextStartTime){
            return false;
        }
        // 昨日的班次
        if (isClasseYestoday) {

        }else {
            // 如果跨天
            if (endTime < startTime) {
                // 跨天， 还没有开始上班，不能打下班卡
                if(now < startTime){
                    return false;
                }
            }else {
                // 不跨天， 还没有开始上班，不能打下班卡
                if(now < startTime){
                    return false;
                }
            }
        }

        return true;
    }

    /**
     * 打卡有加班时，调用
     * @param userOvertime
     * @param dbUserOvertime 已存在的加班,如果该参数有值，说明是更新了下班打卡
     */
    public void onUserOvertime(UserOvertime userOvertime,UserOvertime dbUserOvertime);
}
